package com.bt.lms.ui.page.sys.user.action;

import com.bt.lms.constants.BOConstant;
import com.bt.lms.constants.SysBizTypeConstant;
import com.bt.lms.entity.page.Page;
import com.bt.lms.network.msg.RespMsg;
import com.bt.lms.ui.page.sys.utils.ArrayUtils;
import com.bt.lms.ui.page.sys.utils.Encode;
import com.bt.lms.ui.page.sys.ServerInfo;
import com.bt.lms.network.msg.ReqMsg;
import com.bt.lms.ui.page.sys.utils.NetWorkUtils;
import com.bt.lms.ui.page.sys.vo.UserTableViewVo;
import com.bt.lms.ui.vo.PageSkipInfo;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.List;

/**
 * 暂停用户按钮事件
 */
public class ULStopBtnAction implements EventHandler<ActionEvent> {

    /**
     * 用户表格视图对象
     */
    private final UserTableViewVo userTableViewVo;

    /**
     * 界面跳转信息
     */
    private final PageSkipInfo pageSkipInfo;

    /**
     * 界面所在容器
     */
    private final Pane inPane;

    /**
     * 构建事件
     *
     * @param userTableViewVo 用户表格视图对象
     * @param inPane 界面所在容器
     */
    public ULStopBtnAction(UserTableViewVo userTableViewVo, PageSkipInfo pageSkipInfo, Pane inPane) {
        this.userTableViewVo = userTableViewVo;
        this.pageSkipInfo = pageSkipInfo;
        this.inPane = inPane;
    }

    /**
     * 事件实现
     *
     * @param event the event which occurred
     */
    @Override
    public void handle(ActionEvent event) {

        Alert alert = new Alert(Alert.AlertType.NONE);
        alert.setHeaderText(null);
        alert.setTitle("暂停");
        PageUserStop pageUserStop = new PageUserStop(alert, userTableViewVo,pageSkipInfo,inPane);
        alert.setGraphic(pageUserStop);//内容显示
        alert.getDialogPane().setMaxWidth(500);//宽度
        alert.getDialogPane().setMaxHeight(500);////高度
        alert.showAndWait();

    }

}

/**
 * 暂停用户界面
 */
class PageUserStop extends VBox {

    /**
     * 构建用户暂停界面
     *
     * @param alert           界面所在弹窗
     * @param userTableViewVo 用户信息
     */
    public PageUserStop(Alert alert, UserTableViewVo userTableViewVo,PageSkipInfo pageSkipInfo,Pane inPane) {
        //布局
        this.setSpacing(10);
        this.setAlignment(Pos.CENTER_RIGHT);
        this.setPadding(new Insets(50));

        //组件
        Label label = new Label("是否暂停此用户：");
        label.setPrefWidth(150);
        label.setAlignment(Pos.CENTER_RIGHT);
        this.getChildren().addAll(label);

        HBox hBox = new HBox();
        hBox.setSpacing(20);
        this.getChildren().add(hBox);

        Button confirm = new Button("确认");
        hBox.getChildren().add(confirm);
        //事件
        UserStopConfirmBtnAction userStopConfirmBtnAction = new UserStopConfirmBtnAction(alert, userTableViewVo,pageSkipInfo,inPane);
        confirm.setOnAction(userStopConfirmBtnAction);

        Button cancel = new Button("取消");
        hBox.getChildren().add(cancel);
        cancel.setOnAction(event -> {
            ButtonType buttonType = new ButtonType("");
            alert.getDialogPane().getButtonTypes().add(buttonType);//添加按钮样式
            alert.close();//只有存在按钮样式，才可以关闭
        });
    }
}

/**
 * 用户暂停界面确认按钮事件
 */
class UserStopConfirmBtnAction implements EventHandler<ActionEvent> {

    /**
     * 弹窗
     */
    private final Alert alert;

    /**
     * 要删除的对象
     */
    private final UserTableViewVo userTableViewVo;

    /**
     * 界面跳转信息
     */
    private final PageSkipInfo pageSkipInfo;

    /**
     * 界面所在容器
     */
    private final Pane inPane;

    /**
     * 构建事件
     *
     * @param alert           弹窗
     * @param userTableViewVo 要删除的用户
     * @param pageSkipInfo 界面跳转信息
     */
    public UserStopConfirmBtnAction(Alert alert, UserTableViewVo userTableViewVo, PageSkipInfo pageSkipInfo,Pane inPane) {
        this.alert = alert;
        this.userTableViewVo = userTableViewVo;
        this.pageSkipInfo = pageSkipInfo;
        this.inPane = inPane;
    }

    @Override
    public void handle(ActionEvent event) {

        ButtonType buttonType = new ButtonType("");
        alert.getDialogPane().getButtonTypes().add(buttonType);//添加按钮样式
        alert.close();//只有存在按钮样式，才可以关闭

        //1 组网发送
        ReqMsg reqMsg = Encode.encodeToMsg(userTableViewVo, SysBizTypeConstant.USER_STOP);
        byte[] reqBytes = reqMsg.toBytes();
        //1.1 组网
        Socket socket = pacNet();
        try {
            OutputStream out = socket.getOutputStream();
            //1.2 发送
            boolean res = sendReq(out, reqBytes);
            if (res) {
                //发送成功，准备接收相应
                try {
                    InputStream in = socket.getInputStream();
                    //2.1 接收
                    List<byte[]> receive = NetWorkUtils.receive(in);
                    //2.2 整理读到的字节流
                    byte[] respBytes = ArrayUtils.joinBytes(receive);
                    //2.2 字节流转响应消息
                    RespMsg respMsg = RespMsg.toRespMsg(respBytes);
                    //2.3 判断状态
                    short status = respMsg.getStatus();
                    if (status == RespMsg.NETWORK_STATUS_NORMAL) {
                        //2.4 关流，结束
                        in.close();
                        out.close();
                        socket.close();
                        finish();
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }

            } else {
                String failStr = "未能成功暂停，请稍候重试。";
                hintFrame(failStr);//提示框
            }
        } catch (IOException e) {
            throw new RuntimeException(e);//拿输出流
        }
    }

    /**
     * 程序结束
     */
    private void finish() {

        //提示弹窗
        Alert alert = new Alert(Alert.AlertType.INFORMATION);

        //保存提示
        alert.setTitle("成功");
        alert.setHeaderText(null);
        alert.setContentText("已成功暂停，请查看。");
        alert.showAndWait();

        //重新加载界面
        NetWorkUtils.reqUserPagingPage(inPane,pageSkipInfo,new Page<>());

    }

    /**
     * 发送请求
     *
     * @param out   客户端连接
     * @param bytes 要发送的数据
     * @return 发送结果
     */
    private boolean sendReq(OutputStream out, byte[] bytes) {


        try {
            out.write(bytes);
            out.flush();

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return true;

    }

    /**
     * 组网
     *
     * @return 网
     */
    private Socket pacNet() {

        String ip = ServerInfo.IP;
        int port = ServerInfo.PORT;

        Socket socket;
        try {
            socket = new Socket(ip, port);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        return socket;
    }

    /**
     * 程序终止
     * 弹窗提示
     *
     * @param result 终止提示
     */
    private void hintFrame(String result) {
        //提示弹窗
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        //错误提示
        alert.setTitle("失败");
        alert.setHeaderText(null);
        alert.setContentText(result);
        alert.showAndWait();
    }
}